/*
 * Copyright (c) 2024 DuckDuckGo
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.duckduckgo.app.survey.rmf

import com.duckduckgo.common.utils.DispatcherProvider
import com.duckduckgo.di.scopes.AppScope
import com.duckduckgo.remote.messaging.api.Action
import com.duckduckgo.remote.messaging.api.JsonActionType.SURVEY
import com.duckduckgo.remote.messaging.api.JsonMessageAction
import com.duckduckgo.remote.messaging.api.MessageActionMapperPlugin
import com.duckduckgo.survey.api.SurveyParameterManager
import com.squareup.anvil.annotations.ContributesMultibinding
import kotlinx.coroutines.runBlocking
import javax.inject.Inject

@ContributesMultibinding(AppScope::class)
class SurveyActionMapper @Inject constructor(
    private val dispatcherProvider: DispatcherProvider,
    private val surveyParameterManager: SurveyParameterManager,
) : MessageActionMapperPlugin {

    override fun evaluate(jsonMessageAction: JsonMessageAction): Action? {
        if (jsonMessageAction.type == SURVEY.jsonValue) {
            val requestedQueryParams = jsonMessageAction.additionalParameters?.get("queryParams")?.split(";") ?: emptyList()

            return runBlocking(dispatcherProvider.io()) {
                if (requestedQueryParams.isEmpty() || surveyParameterManager.buildSurveyUrlStrict(
                        jsonMessageAction.value,
                        requestedQueryParams,
                    ) != null
                ) {
                    Action.Survey(jsonMessageAction.value, jsonMessageAction.additionalParameters)
                } else {
                    null
                }
            }
        }
        return null
    }
}
